home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Freeware / Read It Later 0.9924 / read_it_later-0.9924-fx.xpi / chrome / isreaditlater.jar / content / ISRILsync.js < prev    next >
Text File  |  2008-10-29  |  18KB  |  603 lines

  1. function ISRILsync()
  2. {
  3.     // -- Define API Connection -- //
  4.     //this.apiURL    =    'http://dent.readitlaterlist.com/v1/';
  5.     this.apiURL    =    'https://readitlaterlist.com/v1/';
  6.     
  7.     // -- Timing -- //
  8.     this.syncInterval;
  9.     this.syncIntervalMain = 15 * (60 * 1000); //minutes
  10.     this.syncTime;
  11.     this.syncTimeInc = 1; //default wait before sending changes to list
  12.     this.syncTimeIncBatch = 5; //default wait after click-to-save mode/right click save changes
  13.     this.syncTimeWaitResolve = 20; //default wait if needing to resolve/download link 
  14.     
  15.     this.usyncInterval = 6 * (60 * 60 * 1000); //hours
  16.     this.usyncIntSteps = 0;
  17.     
  18.     this.queueWriteInt = 500; //Time to wait before running through adding items to queue.  This offset allows mass changes to skip waiting for writes to the DB.
  19.  
  20.  
  21.     this.tagUpdateTimeouts = new Object();
  22.     this.startUpSync;
  23.     this.updatesTmp = new Object();
  24.     this.writeQueue = new Object();
  25.     
  26. }
  27.  
  28. ISRILsync.prototype = {
  29.     
  30.     _init : function() {
  31.         ISRILglobals.syncInterval = setTimeout('ISRILsync.sendUpdates()', ISRILsync.syncIntervalMain); //attempt to send every 15 minutes
  32.         if (!ISRILglobals.inited) {
  33.             ISRILglobals.startUpSync = setTimeout('ISRILsync.getUpdatesStart();', 10000); //get updates 10 seconds after startup
  34.             ISRILsync.uSyncIntervalCheck();
  35.         }
  36.         ISRILglobals.noSyncId = false;
  37.     },
  38.     
  39.     // --- //
  40.     
  41.     ReadySync : function(inc) {
  42.         if (ISRILsync.syncTime) { clearTimeout(ISRILsync.syncTime); }
  43.         ISRILsync.syncTime = setTimeout('ISRILsync.sendUpdates()', (inc?inc:ISRILsync.syncTimeInc)*1000 );
  44.         ISRILglobals.noSyncId = null;
  45.     },
  46.     uSyncIntervalCheck : function() {
  47.         if (ISRILsync.usyncIntSteps >= ISRILsync.usyncInterval / ISRILsync.syncIntervalMain) {
  48.             ISRILsync.usyncIntSteps = 0;
  49.             ISRILsync.getUpdatesStart();    
  50.         } else {
  51.             ISRILsync.usyncIntSteps++;    
  52.         }
  53.         ISRILglobals.usyncInterval = setTimeout('ISRILsync.uSyncIntervalCheck();', ISRILsync.syncIntervalMain); //check uSync interval
  54.     },
  55.     
  56.     // --- //
  57.     
  58.     _reset : function() {
  59.         ISRILprefs.setPref('temp-sync-inserts', '');
  60.         ISRILprefs.setPref('temp-sync-updates', '');
  61.         ISRILprefs.setPref('temp-sync-tagUpdates', '');
  62.         if (ISRILsync.syncTime) { clearTimeout(ISRILsync.syncTime); }
  63.         ISRILglobals.noSyncId = null;
  64.     },
  65.     
  66.     // -- Database Sync Queue -- //
  67.     
  68.     Queue : function(id, type, url, delay) {        
  69.         clearInterval(ISRILsync.queueWriteTO);
  70.         ISRILsync.writeQueue[id] = {id:id, type:type,url:url?url:'',delay:delay?delay:null};
  71.         ISRILsync.queueWriteTO = setTimeout('ISRILsync.QueueWrite()', ISRILsync.queueWriteInt );
  72.     },
  73.     
  74.     QueueWrite : function() {
  75.         if (ISRILprefs.prefB('feed')) {
  76.             for(var i in ISRILsync.writeQueue) {
  77.                 var item = ISRILsync.writeQueue[i];
  78.                 if (item) {
  79.                     ISRIL.d(item.id + '---' + item.type + '---' + item.url);
  80.                     var time = ISRIL.now();
  81.                     var sql = "REPLACE INTO ril_sync_queue (id, type, dateUpdated, url) VALUES (?1, ?2, "+time+", ?3)"
  82.                     var statement = ISRIL.DB.createStatement(sql);
  83.                         statement.bindInt32Parameter(0, item.id);
  84.                         statement.bindUTF8StringParameter(1, item.type);
  85.                         statement.bindUTF8StringParameter(2, item.url?item.url:'');    
  86.                         statement.execute();    
  87.                         statement.reset();    
  88.                     ISRILsync.ReadySync(item.delay?item.delay:null);
  89.                 }
  90.             }    
  91.         }
  92.         ISRILsync.writeQueue = new Object();
  93.         ISRILxul.UpdateViews();
  94.     },
  95.     
  96.     QueueNew : function(id, url, delay) {
  97.         if (id && id != ISRILglobals.noSyncId) {
  98.             ISRILsync.Queue(id, 'new', url?url:null, delay?delay:null);
  99.             ISRIL.CacheAdd(id, url);
  100.         }
  101.     },
  102.  
  103.     QueueUpdate : function(id, type, url) {
  104.         if (!url) { url = url = ( (ISRILglobals.ListCache[id]) ? (ISRILglobals.ListCache[id]) : (ISRIL.sBookmarks.getBookmarkURI(id).spec) ); }
  105.         if (id && id != ISRILglobals.noSyncId) {
  106.             ISRILsync.Queue(id, type, url);        
  107.             ISRILglobals.CacheStale = true;
  108.         }
  109.     },
  110.     
  111.     QueueUpdateTags : function(id, now) {
  112.         
  113.         //Because the modified listener fires for every tag that's updated, need to use a timeout to wait till it's done before adding to queue, or it's slow
  114.         if (id && id != ISRILglobals.noSyncId) {
  115.             if (!now) { 
  116.                 if (ISRILsync.tagUpdateTimeouts[id]) { 
  117.                     clearTimeout( ISRILsync.tagUpdateTimeouts[id] );
  118.                 }
  119.                 ISRILsync.tagUpdateTimeouts[id] = setTimeout('ISRILsync.QueueUpdateTags('+id+',true)', 333);
  120.                 //The timeout is needed because this is called one by one for every tag, it avoids sending the server duplicate updates
  121.             } else {
  122.                 ISRILsync.QueueUpdate(id, 'update_tags');
  123.             }
  124.         }
  125.     },
  126.     
  127.     // -- //
  128.     
  129.     ClearQueue : function(time) {
  130.         ISRIL.DB.executeSimpleSQL("DELETE FROM ril_sync_queue WHERE dateUpdated <= " + time);
  131.     },
  132.     
  133.     // -- Assemble Querystrings for request types -- //
  134.     
  135.     GetQueueType : function(type) {
  136.         var items = {};
  137.         var sql = "SELECT id, url FROM ril_sync_queue WHERE type = ?1"
  138.         var statement = ISRIL.DB.createStatement(sql);
  139.             statement.bindUTF8StringParameter(0, type);
  140.         while (statement.executeStep()) {
  141.             try {
  142.                 url = statement.getUTF8String(1);
  143.                 id = statement.getInt32(0);
  144.                 items[ id ] = url ? url : ISRIL.sBookmarks.getBookmarkURI(id).spec;
  145.             } catch(e) { ISRIL.d('ERROR: ' + id); }
  146.         }
  147.         statement.reset();
  148.         return items;
  149.     },
  150.     
  151.     GetQueryNew : function() {
  152.         var items = new Object();
  153.         var ids = ISRILsync.GetQueueType( 'new' );
  154.         for(var i in ids) {
  155.             try {
  156.                 items[i] = {
  157.                     url    :    ISRIL.e( ids[i] ),
  158.                     title    :    ISRIL.e( ISRIL.sBookmarks.getItemTitle(i) ),
  159.                     tags    :    ISRIL.e( ISRIL.sTags.getTagsForURI(ISRIL.uri(ids[i]), {}).join(',') )
  160.                 }
  161.             } catch(e) { ISRIL.d('ERROR: ' + id); }
  162.         }
  163.         return items;
  164.     },
  165.     
  166.     GetQueryRead : function() {
  167.         var items = new Object();
  168.         var ids = ISRILsync.GetQueueType( 'read' );
  169.         for(var i in ids) {
  170.             try {
  171.                 items[i] = {url : ISRIL.e( ids[i] ) };
  172.             } catch(e) { ISRIL.d('ERROR: ' + id); }
  173.         }
  174.         return items;
  175.     },
  176.     
  177.     GetQueryUpdateTitle : function() {
  178.         var items = new Object();
  179.         var ids = ISRILsync.GetQueueType( 'update_title' );
  180.         for(var i in ids) {
  181.             try {
  182.                 items[i] = {
  183.                     url    :    ISRIL.e( ids[i] ),
  184.                     title    :    ISRIL.e( ISRIL.sBookmarks.getItemTitle(i) )
  185.                 }
  186.             } catch(e) { ISRIL.d('ERROR: ' + id); }
  187.         }
  188.         return items;
  189.     },
  190.     
  191.     GetQueryUpdateTags : function() {
  192.         var items = new Object();
  193.         var ids = ISRILsync.GetQueueType( 'update_tags' );
  194.         for(var i in ids) {
  195.             try {
  196.                 items[i] = {
  197.                     url    :    ISRIL.e( ids[i] ),
  198.                     tags    :    ISRIL.e( ISRIL.sTags.getTagsForURI(ISRIL.uri(ids[i]), {}).join(',') )
  199.                 }
  200.             } catch(e) { ISRIL.d('ERROR: ' + id); }
  201.         }
  202.         return items;
  203.     },
  204.     
  205.     QueueExists : function() {
  206.         var sql = "SELECT COUNT(*) FROM ril_sync_queue"
  207.         var statement = ISRIL.DB.createStatement(sql);
  208.         statement.executeStep();
  209.         var cnt = statement.getInt32(0);
  210.         statement.reset();
  211.         return cnt;
  212.     },
  213.     
  214.     // -- Query API -- //
  215.     
  216.     sendUpdates : function(callbackArg) {
  217.         ISRIL.d('SEND----------');        
  218.         ISRILxul.UpdateViews();
  219.         
  220.         //If connection failure TO - wait???  - remove this??
  221.         if (ISRILsync.connectFailure) {
  222.             return false;
  223.         } 
  224.  
  225.         //If we are online and user has opted to send data to feed, step in
  226.         if (navigator.onLine && ISRILprefs.prefB('feed') && ISRILsync.QueueExists() > 0) {
  227.             
  228.             ISRILsync.syncStartedTime = ISRIL.now();
  229.             
  230.             //Get Update Query Strings
  231.             ISRILsync.updatesTmp = new Object();
  232.             var New     =     Array('&new='     , ISRIL.json.encode( ISRILsync.GetQueryNew() ));
  233.             var Read     =     Array('&read='     , ISRIL.json.encode( ISRILsync.GetQueryRead() ));
  234.             var UpdateTitle =     Array('&update_title=', ISRIL.json.encode( ISRILsync.GetQueryUpdateTitle() ));
  235.             var UpdateTags     =     Array('&update_tags=' , ISRIL.json.encode( ISRILsync.GetQueryUpdateTags() )); 
  236.             
  237.         
  238.             //If we have at least one thing to update, do it            
  239.             var ajax = new ISRILajax();
  240.             params = ISRILsync.lin()+New.join('')+Read.join('')+UpdateTitle.join('')+UpdateTags.join('')+'&callback[]='+((callbackArg)?(callbackArg):(''));
  241.             ISRIL.d(params);
  242.             ajax.post(ISRILsync.apiURL + 'send', ISRILsync.sendUpdatesCallback, params);
  243.             return true;
  244.             
  245.         }
  246.         
  247.         //If sync was not attempted for one of the reasons above, carry on as if it happened
  248.         ISRILsync.sendUpdatesDone(callbackArg);
  249.     },
  250.     
  251.     /*
  252.      Expected:
  253.      JSON Object:
  254.         status - 1 if success, 0 if failed
  255.         callback - general arguments being passed through from original ajax request
  256.         error - if there was a specific error
  257.         updated_login - updated login info if using old feed id/pass
  258.         msg - only pertains if error is for server maintenance
  259.     Does:
  260.         -Check for errors
  261.         -Clear Annotations for updates
  262.     */
  263.     sendUpdatesCallback : function(r) {
  264.         //ISRIL.d('sendUpdatesCallback: ' + r);
  265.         var data = {};
  266.         
  267.         try {        
  268.             var data = ISRIL.json.decode(r);
  269.             if (!data.error) { //yay, we made it
  270.                 
  271.                 //Clear out the sync queue
  272.                 ISRILsync.ClearQueue(ISRILsync.syncStartedTime);
  273.                 
  274.                 //If Login is being changed
  275.                 if (data.updated_login) {
  276.                     ISRIL.d('update login');
  277.                     ISRILsync.UpdateLogin(data.updated_login.feed_id, data.updated_login.pass)
  278.                 }
  279.                 
  280.                 //Pass through to callback argument handler
  281.                 return ISRILsync.sendUpdatesDone(data.callback);
  282.             }
  283.         } catch(e) {
  284.             data.error = r.length > 0 ? 1 : 0;
  285.         }
  286.         
  287.         //If here, then there was a problem, so we go through possible errors    
  288.         
  289.         return ISRILsync.whatError(data);
  290.     },
  291.     
  292.     sendUpdatesDone : function(c) {                
  293.         ISRILsync._reset();
  294.         
  295.         //If we should get updates after this, let's do it
  296.         switch (c + '') {
  297.             case('get'):
  298.                 ISRILsync.getUpdates();
  299.                 break;
  300.             
  301.             case('shutdown'):
  302.                 ISRIL.shutdown();
  303.                 break;
  304.             
  305.         }
  306.     },
  307.     
  308.     // - //
  309.     
  310.     getUpdatesStart : function(hs) {
  311.         ISRILsync.hardSync = hs;
  312.         ISRILsync.connectFailure = false; //reset if set, since this is a manual check
  313.         ISRILsync.sendUpdates('get');
  314.     },
  315.     
  316.     getUpdates : function() {
  317.         ISRIL.d('GET-----------');
  318.         
  319.         //If we are online and the user has opted to sync, then step in
  320.         if (navigator.onLine && ISRILprefs.prefB('sync')) {        
  321.             var params = ISRILsync.lin();
  322.             
  323.             if (!ISRILsync.hardSync) {
  324.                 params    += '&since=' + ISRILprefs.pref('last_get');
  325.             }
  326.             
  327.             var ajax = new ISRILajax();    
  328.             ajax.post(ISRILsync.apiURL + 'get', ISRILsync.getUpdatesCallback, params);
  329.             ISRIL.d(params);
  330.             return true;
  331.         }
  332.     },
  333.     
  334.     /*
  335.      Expected:
  336.      JSON Object:
  337.         status - (1 - new items sent, 2 - no new items, you are up-to-date)
  338.         list - list of items (including url, title, tags)
  339.         time - server time of this request
  340.         error - if there was a specific error
  341.         msg - only pertains if error is for server maintenance
  342.     Does:
  343.         -Check for errors
  344.         -Process updates
  345.     */
  346.     getUpdatesCallback : function(r) {
  347.         ISRIL._func = ISRILsync.getUpdatesCallbackBatch;
  348.         ISRIL._args = arguments;    
  349.         ISRIL.sBookmarks.runInBatchMode(ISRIL, null);
  350.     },
  351.     
  352.     getUpdatesCallbackBatch : function(r) {
  353.         ISRIL.d('GET RESPONSE: ' + r);
  354.         var data = {};
  355.         var errorMsg = false;
  356.         
  357.         if (ISRILsync.hardSync) {
  358.             ISRIL.GetList();
  359.         }
  360.         var compare = ISRILglobals.ListCache;
  361.         
  362.         try {
  363.             var data = ISRIL.json.decode(r);
  364.             if (!data.error) { //yay, we made it
  365.                 
  366.                 if (data.status == 1) {
  367.                     /*
  368.                      Syncing Logic:
  369.                     Read on server?
  370.                         On local list?
  371.                             Remove - do not send as update
  372.                             Remove from HardSync Compare List
  373.                     Unread on server?
  374.                         On local list?
  375.                             Title or Tags Different?
  376.                                 Update - do not send as update
  377.                                 Remove from HardSync Compare List
  378.                            Off list?
  379.                                Add to list
  380.                     */
  381.  
  382.                     for(var i in data.list) {
  383.                         var item = data.list[i];
  384.                         ISRIL.d('-----');
  385.                         ISRIL.d(item.url);
  386.                         try { var itemId = ISRIL.InList( item.url ); } catch(err) {
  387.                             ISRIL.d('InList Error: ' + err);
  388.                         }
  389.                         if (item.status == 1) { //read on server?
  390.                             ISRIL.d('read');
  391.                             if (itemId) { //on local list?
  392.                                 ISRIL.d('on list');
  393.                                 ISRIL.MarkAsRead(itemId, true, null, true);
  394.                                 compare[itemId] = false;
  395.                             }
  396.                         } else { //unread on server?
  397.                             if (itemId) { //on local list?
  398.                                 ISRIL.d('unread - on list');
  399.                                 ISRILglobals.noSyncId = itemId;
  400.                                 ISRIL.sBookmarks.setItemTitle(itemId , item.title);
  401.                                 if (item.tags) {
  402.                                     ISRIL.d('tags');    
  403.                                     var uri = ISRIL.uri( item.url );
  404.                                     //ISRIL.sTags.untagURI( uri, ISRIL.sTags.getTagsForURI( uri, {}), 1); //remove all tags
  405.                                     ISRIL.d('TAGS-');
  406.                                     ISRIL.d(item.tags);
  407.                                     ISRIL.d('TAGS---');
  408.                                     ISRIL.d(ISRIL.TrimArray(item.tags));
  409.                                     ISRIL.sTags.tagURI( uri, ISRIL.TrimArray(item.tags), 1 ); //add all tags    
  410.                                 }
  411.                                 compare[itemId] = false;
  412.                             } else { //not on local list
  413.                                 ISRIL.d('add');                        
  414.                                 //Add Items                    
  415.                                 var bookmarkId = ISRIL.Save(item.url, item.title, true);
  416.                                 ISRILglobals.noSyncId = bookmarkId;
  417.                                 ISRIL.sBookmarks.setItemDateAdded(bookmarkId, item.time_added*1000*1000);        
  418.                                 
  419.                                 //Update Tags
  420.                                 if (item.tags) {
  421.                                     ISRIL.d('add tags');    
  422.                                     var uri = ISRIL.uri( ISRIL.sBookmarks.getBookmarkURI(bookmarkId).spec );
  423.                                     ISRIL.sTags.tagURI( uri, ISRIL.TrimArray(item.tags), 1 ); //add all tags
  424.                                 }
  425.                             }
  426.                         }
  427.                     }                    
  428.                     
  429.                 }
  430.                 ISRIL.d('EXIT');
  431.                 //list was or is now up-to-date
  432.                 
  433.                 if (ISRILsync.hardSync) {
  434.                     for(i in compare) {
  435.                         if (compare[i]) { ISRILsync.Queue(i, 'new', compare[i]); }
  436.                     }
  437.                     ISRILsync.hardSync = false;
  438.                 }
  439.                 
  440.                 //update last sync time
  441.                 ISRILprefs.setPref('last_get', data.time);
  442.                 
  443.                 if (!ISRILxul.List.hidden) {
  444.                     ISRILsync.ReadingListSyncDone();
  445.                 }
  446.                 
  447.                 return true;
  448.             }
  449.         } catch(err) {
  450.             errorMsg = err;
  451.             ISRIL.d('SYNC ERROR: '+errorMsg)
  452.             data.error = r.length > 0 ? 1 : 0;
  453.         }
  454.         
  455.         //If here, then there was a problem, so we go through possible errors    
  456.         
  457.         return ISRILsync.whatError(data, errorMsg);
  458.     },
  459.     
  460.     // --- //
  461.     
  462.     whatError : function(data, err) {
  463.         switch(data.error) {
  464.             case(1):
  465.                 return ISRILsync.ErrorSync(err);
  466.             
  467.             case(2):
  468.                 return ISRILsync.ErrorLogin();
  469.             
  470.             case(3):
  471.                 return ISRILsync.ErrorMaintenance(data.msg);
  472.             
  473.             default:
  474.                 return ISRILsync.ErrorConnection();
  475.         }
  476.     },
  477.         
  478.     // --- //
  479.     
  480.     UpdateLogin : function(a,b) {
  481.         ISRILprefs.setPref( 'feed-id-'+ISRILprefs.pref('feed-which') , a );
  482.         ISRILprefs.setPref( 'sync-'+ISRILprefs.pref('feed-which') , b );
  483.         ISRILprefs.setPref( 'sync',    true);
  484.     },
  485.     CheckLogin : function(a,b,callback) {
  486.         var ajax = new ISRILajax();
  487.         ajax.post(ISRILsync.apiURL + 'login', callback, ISRILsync.lin(a,b));
  488.     },
  489.     
  490.     // -- //
  491.     
  492.     ErrorSync : function(err) {
  493.         ISRILxul.ListErrorSet(true, {txt:ISRIL.l('SyncError'), txt2:err?ISRIL.l('ErrorMayHelp')+"\n\n"+err:'', onclk:'ISRILsync.ReadingListSync()' });
  494.     },    
  495.     ErrorLogin : function() {
  496.         ISRILxul.ListErrorSet(true, {txt:ISRIL.l('CannotSync'), onclk:'ISRILxul.OpenOptions(\'sync\');', buttonTxt:ISRIL.l('SyncOptions') } );
  497.     },
  498.     ErrorConnection : function() {
  499.         ISRILxul.ListErrorSet(true, {txt:ISRIL.l('CannotConnect'), onclk:'ISRILsync.ReadingListSync()' });
  500.     },
  501.     ErrorMaintenance : function(msg) {
  502.         ISRILxul.ListErrorSet(true, {txt:msg?msg:ISRIL.l('MaintenanceModeDefault'), onclk:'ISRILsync.ReadingListSync()'});
  503.     },
  504.     
  505.     // --- //
  506.     lin : function(a,b) { return 'feed_id=' + ( (a) ? (a):(ISRILsync.feedId()) ) + '&pass=' + ( (b) ? (b):(ISRILsync.syncP()) ); },
  507.     
  508.     feedId : function() {
  509.         return ISRILprefs.pref('feed-id-'+ISRILprefs.pref('feed-which'));
  510.     },
  511.     
  512.     syncP : function() {
  513.         return ISRILprefs.pref('sync-'+ISRILprefs.pref('feed-which'));
  514.     },
  515.     
  516.     // --- //
  517.     
  518.     ReadingListSync : function(hs) {
  519.         ISRILxul.bip('Empty').hidden = true;
  520.         ISRILxul.bip('ListFooter').hidden = true;
  521.         ISRILxul.ListNotifySet('Sync', false);
  522.         ISRILxul.ListMsgSet(true, 'Syncing');
  523.         ISRILsync.getUpdatesStart(hs);
  524.     },
  525.     ReadingListSyncDone : function() {
  526.         ISRILxul.bip('ListFooter').hidden = false;
  527.         ISRILxul.FillList(false, true);
  528.         ISRILxul.ListNotifySet('Sync', true);
  529.         ISRILxul.ListMsgSet(false);
  530.     },
  531.     
  532.     // --- //
  533.     
  534.     GetAFeed : function(force) {
  535.         if (ISRILprefs.pref('feed-id-default')==0 || force) {
  536.             var ajax = new ISRILajax();
  537.             ajax.post(ISRILsync.apiURL + 'newUser', ISRILsync.GetAFeedDone, 'hello=1');
  538.         }
  539.     },
  540.     GetAFeedDone : function(r) {
  541.         var data = {};
  542.         try {
  543.             var data = ISRIL.json.decode(r);
  544.         } catch(err) {}
  545.         
  546.         if (data.msg) {
  547.             return ISRILxul.sPrompt.alert(window, ISRIL.l('ProblemCreating'), ISRIL.l('ProblemCreatingMsg') + "\n\n" + data.msg );            
  548.         }
  549.         if (data.status >= 1) {    
  550.             ISRILprefs.setPref('feed', true);
  551.             ISRILprefs.setPref('feed-id-default', data.feed_id);
  552.             ISRILprefs.setPref('sync-default', data.pass);
  553.             ISRILsync.getUpdatesStart(true);
  554.             if (data.status == '2') {
  555.                 ISRILprefs.setPref('sync', true);
  556.             }
  557.         } else {
  558.             ISRILprefs.setPref('feed', false);
  559.             ISRILxul.sPrompt.alert(window, ISRIL.l('ProblemCreating'), ISRIL.l('ProblemCreatingMsg') );
  560.         }
  561.     },
  562.     GetIn : function() {
  563.         var ajax = new ISRILajax();
  564.         ajax.post('https://readitlaterlist.com/login_process-ril.php', ISRILsync.GetInDone, ISRILsync.lin());    
  565.     },    
  566.     GetInDone : function(r) {
  567.         
  568.     }
  569.     
  570. }
  571.  
  572. var ISRILsync = new ISRILsync();
  573.  
  574.  
  575. function ISRILajax()
  576. {
  577.     
  578. }
  579.  
  580. ISRILajax.prototype = {
  581.     post : function (uri, callback, parameters) {
  582.         this.callback = callback;
  583.         this.transport = new XMLHttpRequest();
  584.         this.osc(this);
  585.         this.transport.open("POST",uri,true);
  586.         this.transport.setRequestHeader("User-Agent" , 'ISRIL '+ISRIL.v);
  587.         this.transport.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
  588.         this.transport.send(parameters); 
  589.     },
  590.         
  591.     osc : function (ajaxObj) {
  592.         ajaxObj.transport.onreadystatechange = function() {
  593.             try {
  594.                 switch(ajaxObj.transport.readyState) {
  595.                     case(4): ajaxObj.callback(ajaxObj.transport.responseText);
  596.                 }
  597.             }
  598.             catch( e ) { //server error
  599.                 //alert('server error');
  600.             }
  601.         }    
  602.     },
  603. }